位图(图片)如何序列化?

chenjmingbbs 2013-07-27 08:42:00
各位大哥:
请问一下,位图或者其他图片如何在mfc环境下,序列化存储到我自定义格式文件中?

备注:我不喜欢用gdi+ 的image类。 请用位图或者图片byte数组存储并贴上代码

...全文
648 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
NPCHard 2013-08-23
  • 打赏
  • 举报
回复
呵呵 这么简单的一个事,,我前几个月就搞过 但是不需要分数 你态度太差了
chenjmingbbs 2013-07-30
  • 打赏
  • 举报
回复
经过一轮通宵可以说搞掂了: On NewDocument: //为了避免新建文件而没有添加图片导致保存文件意外。 long bufsize=522240; BYTE* pbuf=(BYTE*)GlobalAllocPtr(GPTR,bufsize); On Serialize(CArchive& ar): //save ar.Write(&bfhbuf,sizeof(BITMAPFILEHEADER)); ar.Write(&bihbuf,sizeof(BITMAPINFOHEADER)); ar<<bufsize; ar.Write(pbuf,bufsize); //load ar.Read(&bfhbuf,sizeof(BITMAPFILEHEADER)); ar.Read(&bihbuf,sizeof(BITMAPINFOHEADER)); ar>>bufsize; pbuf=(BYTE*)GlobalAllocPtr(GPTR,bufsize); ar.Read(pbuf,bufsize); f_Init=FALSE;//打开文件第一次刷背景后置TRUE 对话框中加载bmp文件(必须在文件已经打开的情况下,加载bmp,因为文件有了,才可以GetDC(),有了设备相关才可以在背景贴图片): void SetPaperImage(HBITMAP bmp) { m_Image=bmp; SetModifiedFlag(); 初始化BITMAPFILEHEADER bfh; 初始化BITMAPINFOHEADER bih; 初始化size; GetDIbits(pView->GetDC()->GetSafeHdc(),mImage,0,bih.biHeight,pbuf,(BITMAPINFO*)&bih,DIB_RGB_COLORS); //将数据(bmp头和bmp的rgb数据保存起来) bfhbuf=bfh; bihbuf=bih; bufsize=size; } 结贴:xianglitian 比较合理 schlafenhamster虽然投机了点,但也很积极,各得100分。 schlafenhamster在这里得100分,xianglitian 在另外一个贴领吧。
schlafenhamster 2013-07-29
  • 打赏
  • 举报
回复
“现在不知道如何生成CBitmap 或者HBITMAP句柄 然后显示在视图背景上面。” 没有 办法 直接,得到 HBITMAP ,这是 微软的 秘密(void* !!!!) 只有 先 读出 bmp 信息, 然后 CBitmap CreateBitmap 然后 读出bits 然后 填充CBitmap 的 bits。 这可 不是 “投机取巧的方法” !!!!
lm_whales 2013-07-29
  • 打赏
  • 举报
回复
DIB 位图有许多API可用,至于GDI+ 应该也有吧,不知道怎么用的话还原出,.BMP 文件然后直接LoadImage即可 DIB 位图 MS称为设备无关位图,即存储到文件里的位图数据。 DIB 位图 转 HBITMAP 位图句柄 1) HBITMAP CreateDIBitmap( HDC hdc, // handle to DC CONST BITMAPINFOHEADER *lpbmih, // bitmap data DWORD fdwInit, // initialization option CONST VOID *lpbInit, // initialization data CONST BITMAPINFO *lpbmi, // color-format data UINT fuUsage // color-data usage ); 2)HBITMAP CreateDIBSection( HDC hdc, // handle to DC CONST BITMAPINFO *pbmi, // bitmap data UINT iUsage, // data type indicator VOID **ppvBits, // bit values HANDLE hSection, // handle to file mapping object DWORD dwOffset // offset to bitmap bit values ); 这种位图,有相关API可以直接绘制到DC上,也可以选到DC上,用一般绘制位图的API 通过BltBit 绘制到DC上 GDI+没用过,不过看了一下MSDN 可以直接加载的
lm_whales 2013-07-29
  • 打赏
  • 举报
回复
有一种简单的办法,存成.Bmp 如果有许多文件,多存几个就是,可以开一个目录存储; 如果觉得不满意,可以把目录下的各个文件复制到一起, 前面加个文件索引,内容为文件名,文件大小,文件顺序; 简单地说打个包,放到一个文件中即可; 如果还不满意,存成压缩文件,可以存成MS 的cab格式,Zip 格式 rar格式,或者其他自定义格式。
向立天 2013-07-29
  • 打赏
  • 举报
回复
引用 20 楼 chenjmingbbs 的回复:
[quote=引用 18 楼 xianglitian 的回复:] CBitmap的GetBitmapBits拿到数据 通过SetBitmapBits设置数据
http://blog.csdn.net/yongshengsilingsa/article/details/6617154 上面如是说:可我生成的图片是空白的。还有它必须CreateCompatibleBitmap(pDC,bkWidth,bkHeight), 我打开文件的时候,pDC还没有吧。[/quote]可以用GetDC获取
chenjmingbbs 2013-07-28
  • 打赏
  • 举报
回复
引用 25 楼 dream238 的回复:
既然是自定义的数据,那么就自己定义一个数据结构,自己实现二进制的读写类不就行了... 至于想怎么读取,怎么用,那是优化需要考虑的东西。
不关自定义数据,显示是图片数据。
ArcRain 2013-07-28
  • 打赏
  • 举报
回复
既然是自定义的数据,那么就自己定义一个数据结构,自己实现二进制的读写类不就行了... 至于想怎么读取,怎么用,那是优化需要考虑的东西。
chenjmingbbs 2013-07-28
  • 打赏
  • 举报
回复
我不想打开文件自动生成一个bmp文件,然后再load到视图背景上!!!!希望高手指点。
chenjmingbbs 2013-07-28
  • 打赏
  • 举报
回复
schlafenhamster 就不要说这种投机取巧的方法了。 目前用 bf.Write(&bfh,sizeof(BITMAPFILEHEADER)); bf.Write(&bih,sizeof(BITMAPINFOHEADER)); bf.Write(lpData,size); 上面三个语句可以从我自定义文件中取出文件令存为bmp文件,而且是正确的图片,没问题。 现在不知道如何生成CBitmap 或者HBITMAP句柄 然后显示在视图背景上面。
schlafenhamster 2013-07-28
  • 打赏
  • 举报
回复
把你 加的 多余 信息 ,放 bmp 后, 应该可以。 读时,从 头 读这个文件 写时, 先写 bmp 文件。
  • 打赏
  • 举报
回复
你用代码 bf.Write(&bfh,sizeof(BITMAPFILEHEADER)); bf.Write(&bih,sizeof(BITMAPINFOHEADER)); bf.Write(lpData,size); 写成的文件,貌似一个bmp文件。 那么问题是lpData部分是否真的包含真彩色bmp位图的数据。如果是那么lpData部分一定可以转换成真彩色bmp位图格式(rgb各八位且各行满足对齐要求)。 你可以先搞清楚哪些部分对应着彩色bmp位图的数据,在上网搜一个用纯C/C++ 读写bmp文件的程序。然后写出从你的文件到标准bmp的转换函数。使用时可以读取你的文件在转换成写成正确的bmp临时文件,然后用api函数(名字忘了)直接导入这个临时bmp文件
chenjmingbbs 2013-07-27
  • 打赏
  • 举报
回复
引用 18 楼 xianglitian 的回复:
CBitmap的GetBitmapBits拿到数据 通过SetBitmapBits设置数据
http://blog.csdn.net/yongshengsilingsa/article/details/6617154 上面如是说:可我生成的图片是空白的。还有它必须CreateCompatibleBitmap(pDC,bkWidth,bkHeight), 我打开文件的时候,pDC还没有吧。
chenjmingbbs 2013-07-27
  • 打赏
  • 举报
回复
也就是说如果你可以用rgb数组+bmp头信息creat出一个bmp对象出来(不要到出到硬盘在load),麻烦你 告诉我,这200分就是你的了。就这么简单!
向立天 2013-07-27
  • 打赏
  • 举报
回复
CBitmap的GetBitmapBits拿到数据 通过SetBitmapBits设置数据
chenjmingbbs 2013-07-27
  • 打赏
  • 举报
回复
引用 15 楼 schlafenhamster 的回复:
“但我这个非“.bmp”文件还有其他数据呢!” 说说你想加什么 多余的 信息 ?
而这个文档中背景图是可以更改的,所以我想做到文档里面存储起来。
chenjmingbbs 2013-07-27
  • 打赏
  • 举报
回复
我这个文件是一个自定义文件,里面是一些自定义的数据,而这个帖子所说的位图只是在这个文档的背景而已。
schlafenhamster 2013-07-27
  • 打赏
  • 举报
回复
“但我这个非“.bmp”文件还有其他数据呢!” 说说你想加什么 多余的 信息 ?
chenjmingbbs 2013-07-27
  • 打赏
  • 举报
回复
高手们! 踊跃点.......这不是100分的贴,是200分的。
chenjmingbbs 2013-07-27
  • 打赏
  • 举报
回复
引用 10 楼 zhousitiaoda 的回复:
HBITMAP CreateBitmap( int nWidth, // bitmap width, in pixels int nHeight, // bitmap height, in pixels UINT cPlanes, // number of color planes UINT cBitsPerPel, // number of bits to identify color CONST VOID *lpvBits // color data array );
这个我试过了,不行。你看能否写个能用的例子?
加载更多回复(12)

19,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧